package org.Image.management.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.Image.management.SpringDataService.Pojo.AppConfig;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class JsonFileUtils {

    /**
     * 保存JSON数据到文件
     *
     * @param parentFolderName 上一级文件夹名称
     * @param jsonData         要保存的JSON数据
     */
    public static void saveJsonToFile(String parentFolderName, Object jsonData) {
        // 创建时间格式化的文件名
        String fileName = GetLocalDateTimeUtils.GetLocalDateTimeFoWinToStrings() + ".json";

        // 构建完整路径
        Path fullPath = Paths.get(AppConfig.JSON_FILE_UTILS_PATH , parentFolderName, fileName);
        try {
            // 确保父目录存在
            Files.createDirectories(fullPath.getParent());
            String jsonStr = JSONUtil.toJsonPrettyStr(jsonData);
            // 将JSON数据写入文件
            FileUtil.writeString(jsonStr, fullPath.toAbsolutePath().toString(), "UTF-8");

        } catch (IOException e) {
            log.error("创建失败{}", e.getMessage());
        }
    }


    /**
     * 读取JSON数据从文件 并转为对象
     *
     * @param parentFolderName 上一级文件夹名称
     * @param fileName         文件名称
     * @param clazz            要转换的对象
     * @param isDelete         删除文件
     * @return JSON数据
     */
    public static <T> T readJsonFromFileToObject(String parentFolderName, String fileName, Class<T> clazz, boolean isDelete) {

        // 构建完整路径
        Path fullPath = Paths.get(AppConfig.JSON_FILE_UTILS_PATH, parentFolderName, fileName);

        return readJsonFromFileToObject(fullPath, clazz, isDelete);
    }

    private static <T> T readJsonFromFileToObject(Path fullPath, Class<T> clazz, boolean isDelete) {
        // 构建完整路径
        try {
            // 确保父目录存在
            Files.createDirectories(fullPath.getParent());
            // 读取JSON数据
            T bean = JSONUtil.toBean(FileUtil.readUtf8String(fullPath.toAbsolutePath().toString()), clazz);
            if (isDelete) {
                FileUtil.del(fullPath);
            }
            return bean;
        } catch (IOException e) {
            log.error("读取失败 {}", e.getMessage());
        }
        return null;
    }


    /**
     * 读取JSON数据从文件 并转为对象
     *
     * @param parentFolderName 上一级文件夹名称
     * @param clazz            要转换的对象
     * @return JSON数据
     */
    public static <T> List<T> readJsonFromFileToObject(String parentFolderName, Class<T> clazz, boolean isDelete) {

        Path fullPath = Paths.get(AppConfig.JSON_FILE_UTILS_PATH, parentFolderName);
        if (!fullPath.toFile().exists()) {
            return new ArrayList<>();
        }
        //读取文件下的文件
        List<Path> filesInDir = Arrays.stream(FileUtil.ls(fullPath.toAbsolutePath().toString()))
                .filter(File::isFile) // 只保留文件，排除目录
                .map(File::toPath)
                .toList();

        return filesInDir.stream()
                .map(e -> readJsonFromFileToObject(e, clazz, isDelete))
                .collect(Collectors.toList());
    }
}
